#!/usr/bin/env python3
"""
机器学习引擎 - 包初始化文件

本模块是机器学习引擎的包初始化文件，提供统一的接口和便捷的导入方式。

主要功能：
- 包初始化：设置包的基本信息和导入路径
- 统一接口：提供简洁的API接口
- 版本管理：管理包的版本信息
- 依赖检查：检查必要的依赖是否安装
- 便捷导入：提供常用的类和函数的便捷导入

使用示例：
    # 导入整个包
    import ml_engine
    
    # 使用便捷接口
    from ml_engine import train_model, predict, load_model
    
    # 使用具体模块
    from ml_engine.dataset import EnhancedProblemDataset
    from ml_engine.trainer import EnhancedMLProblemClassifier
    from ml_engine.predictor import MLPredictor
"""

import os
import sys
import warnings
from typing import Dict, List, Any, Tuple, Optional

# 包版本信息
__version__ = "1.0.0"
__author__ = "TestCaseProject Team"
__email__ = "testcase@example.com"
__description__ = "机器学习引擎 - 智能测试用例生成系统的ML组件"

# 包信息
__all__ = [
    # 核心类
    'EnhancedProblemDataset',
    'EnhancedMLProblemClassifier', 
    'EnhancedMLModelTrainer',
    'MLPredictor',
    'MLModelManager',
    'MLConfig',
    
    # 便捷函数
    'train_model',
    'predict',
    'load_model',
    'get_model_info',
    'list_models',
    
    # 配置
    'config',
    
    # 版本信息
    '__version__',
    '__author__',
    '__description__'
]

# 检查依赖
def _check_dependencies():
    """检查必要的依赖是否安装"""
    missing_deps = []
    
    # 检查基础依赖
    try:
        import numpy
    except ImportError:
        missing_deps.append('numpy')
    
    try:
        import pandas
    except ImportError:
        missing_deps.append('pandas')
    
    try:
        import sklearn
    except ImportError:
        missing_deps.append('scikit-learn')
    
    # 检查可选依赖
    optional_deps = []
    
    try:
        import xgboost
    except ImportError:
        optional_deps.append('xgboost')
    
    try:
        import gensim
    except ImportError:
        optional_deps.append('gensim')
    
    try:
        import jieba
    except ImportError:
        optional_deps.append('jieba')
    
    # 报告依赖状态
    if missing_deps:
        raise ImportError(f"缺少必要依赖: {', '.join(missing_deps)}")
    
    if optional_deps:
        warnings.warn(f"缺少可选依赖: {', '.join(optional_deps)}. 某些功能可能不可用。")

# 检查依赖
try:
    _check_dependencies()
except ImportError as e:
    print(f"依赖检查失败: {e}")
    print("请安装必要的依赖: pip install numpy pandas scikit-learn")

# 导入核心模块
try:
    from .dataset import EnhancedProblemDataset
    from .trainer import EnhancedMLProblemClassifier, EnhancedMLModelTrainer
    from .predictor import MLPredictor, MLModelManager
    from .config.settings import MLConfig, config
except ImportError as e:
    print(f"模块导入失败: {e}")
    # 提供占位符类
    class EnhancedProblemDataset:
        def __init__(self, *args, **kwargs):
            raise ImportError("EnhancedProblemDataset 不可用，请检查依赖安装")
    
    class EnhancedMLProblemClassifier:
        def __init__(self, *args, **kwargs):
            raise ImportError("EnhancedMLProblemClassifier 不可用，请检查依赖安装")
    
    class MLPredictor:
        def __init__(self, *args, **kwargs):
            raise ImportError("MLPredictor 不可用，请检查依赖安装")

# 便捷函数
def train_model(model_type: str = "ensemble", data_dir: str = None) -> Dict[str, Any]:
    """
    便捷的训练函数
    
    参数:
        model_type (str): 模型类型
        data_dir (str): 数据目录
        
    返回:
        Dict[str, Any]: 训练结果
    """
    try:
        trainer = EnhancedMLModelTrainer(data_dir)
        return trainer.train_all_models()
    except Exception as e:
        print(f"训练失败: {e}")
        return {}

def predict(text: str, model_file: str = "best_model.joblib") -> Tuple[str, float]:
    """
    便捷的预测函数
    
    参数:
        text (str): 要预测的文本
        model_file (str): 模型文件名
        
    返回:
        Tuple[str, float]: (预测标签, 置信度)
    """
    try:
        predictor = MLPredictor()
        if predictor.load_model(model_file):
            return predictor.predict(text)
        else:
            return "unknown", 0.0
    except Exception as e:
        print(f"预测失败: {e}")
        return "unknown", 0.0

def load_model(model_file: str = "best_model.joblib") -> Optional[MLPredictor]:
    """
    便捷的模型加载函数
    
    参数:
        model_file (str): 模型文件名
        
    返回:
        Optional[MLPredictor]: 加载的预测器实例
    """
    try:
        predictor = MLPredictor()
        if predictor.load_model(model_file):
            return predictor
        else:
            return None
    except Exception as e:
        print(f"模型加载失败: {e}")
        return None

def get_model_info(model_file: str = "best_model.joblib") -> Dict[str, Any]:
    """
    获取模型信息
    
    参数:
        model_file (str): 模型文件名
        
    返回:
        Dict[str, Any]: 模型信息
    """
    try:
        manager = MLModelManager()
        return manager.get_model_info(model_file)
    except Exception as e:
        print(f"获取模型信息失败: {e}")
        return {}

def list_models() -> List[Dict[str, Any]]:
    """
    列出所有可用的模型
    
    返回:
        List[Dict[str, Any]]: 模型列表
    """
    try:
        manager = MLModelManager()
        return manager.list_models()
    except Exception as e:
        print(f"列出模型失败: {e}")
        return []

# 包初始化信息
def get_package_info() -> Dict[str, Any]:
    """获取包信息"""
    return {
        'name': 'ml_engine',
        'version': __version__,
        'author': __author__,
        'email': __email__,
        'description': __description__,
        'python_version': sys.version,
        'platform': sys.platform
    }

# 包初始化
def _init_package():
    """初始化包"""
    # 创建必要的目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    directories = [
        os.path.join(current_dir, 'data', 'raw'),
        os.path.join(current_dir, 'data', 'processed'),
        os.path.join(current_dir, 'data', 'enhanced'),
        os.path.join(current_dir, 'models', 'trained'),
        os.path.join(current_dir, 'models', 'checkpoints'),
        os.path.join(current_dir, 'models', 'logs'),
        os.path.join(current_dir, 'config'),
    ]
    
    for directory in directories:
        os.makedirs(directory, exist_ok=True)
    
    print(f"机器学习引擎 v{__version__} 初始化完成")

# 自动初始化
_init_package()

if __name__ == "__main__":
    """包信息显示"""
    info = get_package_info()
    print("机器学习引擎包信息:")
    for key, value in info.items():
        print(f"  {key}: {value}")
    
    print(f"\n可用功能:")
    print(f"  - 数据增强: EnhancedProblemDataset")
    print(f"  - 模型训练: EnhancedMLProblemClassifier")
    print(f"  - 模型预测: MLPredictor")
    print(f"  - 配置管理: MLConfig")
    
    print(f"\n便捷函数:")
    print(f"  - train_model(): 训练模型")
    print(f"  - predict(): 预测文本")
    print(f"  - load_model(): 加载模型")
    print(f"  - list_models(): 列出模型")
    
    print(f"\n使用示例:")
    print(f"  from ml_engine import train_model, predict")
    print(f"  results = train_model('ensemble')")
    print(f"  prediction, confidence = predict('计算两个数的和')")
